package com.miyu.system.service.file.impl;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.unit.DataUnit;
import cn.hutool.core.util.StrUtil;
import com.blinkfox.fenix.specification.FenixSpecification;
import com.miyu.system.dao.file.FileManagerDao;
import com.miyu.system.pojo.system.SysFileManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.mica.core.utils.BeanUtil;
import org.liuxp.minioplus.api.StorageService;
import org.liuxp.minioplus.api.model.dto.FileMetadataInfoDTO;
import org.liuxp.minioplus.api.model.dto.FileMetadataInfoSaveDTO;
import org.liuxp.minioplus.api.model.dto.FileMetadataInfoUpdateDTO;
import org.liuxp.minioplus.api.model.vo.FileMetadataInfoVo;
import org.liuxp.minioplus.core.repository.MetadataRepository;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Slf4j
@Service
@RequiredArgsConstructor
public class MetadataRepositoryImpl  implements MetadataRepository {
    private final FileManagerDao  fileManagerDao;


    /**
     * @param fileMetadataInfoDTO
     * @return
     */
    @Override
    public List<FileMetadataInfoVo> list(FileMetadataInfoDTO fileMetadataInfoDTO) {
        List<SysFileManager> fm = fileManagerDao.findAll(FenixSpecification.of(builder ->
                builder.andEquals("createUser", fileMetadataInfoDTO.getCreateUser(), StrUtil.isNotBlank(fileMetadataInfoDTO.getCreateUser()))
                        .andEquals("storageBucket", fileMetadataInfoDTO.getBucket(), StrUtil.isNotBlank(fileMetadataInfoDTO.getBucket()))
                        .andEquals("fileMd5",fileMetadataInfoDTO.getFileMd5(),StrUtil.isNotBlank(fileMetadataInfoDTO.getFileMd5()))
                        .andEquals("fileKey",fileMetadataInfoDTO.getFileKey(),StrUtil.isNotBlank(fileMetadataInfoDTO.getFileKey()))
                        .build()));
        return BeanUtil.copyProperties(fm, FileMetadataInfoVo.class);
    }

    /**
     * @param fileMetadataInfoDTO
     * @return
     */
    @Override
    public FileMetadataInfoVo one(FileMetadataInfoDTO fileMetadataInfoDTO) {

       List<SysFileManager> fm = fileManagerDao.findAll(FenixSpecification.of(builder ->
                builder.andEquals("createUser", fileMetadataInfoDTO.getCreateUser(), StrUtil.isNotBlank(fileMetadataInfoDTO.getCreateUser()))
                        .andEquals("storageBucket", fileMetadataInfoDTO.getBucket(), StrUtil.isNotBlank(fileMetadataInfoDTO.getBucket()))
                        .andEquals("fileMd5",fileMetadataInfoDTO.getFileMd5(),StrUtil.isNotBlank(fileMetadataInfoDTO.getFileMd5()))
                        .andEquals("fileKey",fileMetadataInfoDTO.getFileKey(),StrUtil.isNotBlank(fileMetadataInfoDTO.getFileKey()))
                        .build()));
       if (!fm.isEmpty()) {
           return SFMToFiv(fm.get(0));
       }
        return  null;
    }

    /**
     * @param fileMetadataInfoSaveDTO
     * @return
     */
    @Override
    public FileMetadataInfoVo save(FileMetadataInfoSaveDTO fileMetadataInfoSaveDTO) {
        SysFileManager sysFileManager = fivToSFM(fileMetadataInfoSaveDTO);
        SysFileManager fileManager = fileManagerDao.saveOrUpdateByNotNullProperties(sysFileManager);
        return SFMToFiv(fileManager);
    }

    /**
     * @param fileMetadataInfoUpdateDTO
     * @return
     */
    @Override
    public FileMetadataInfoVo update(FileMetadataInfoUpdateDTO fileMetadataInfoUpdateDTO) {
        return null;
    }

    /**
     * @param aLong
     * @return
     */
    @Override
    public Boolean remove(Long aLong) {
        fileManagerDao.deleteById(aLong);
        return true;
    }

    /**
     * 转换映射
     * @param f
     * @return
     */
    public SysFileManager fivToSFM(FileMetadataInfoSaveDTO f){
        SysFileManager fileManager = BeanUtil.copyProperties(f, SysFileManager.class);
        if(fileManager != null){
            fileManager.setIsFinished(f.getIsFinished()?1:0);
            fileManager.setIsPart(f.getIsPart()?1:0);
            fileManager.setIsPreview(f.getIsPreview()?1:0);
            fileManager.setIsPrivate(f.getIsPrivate()?1:0);
            fileManager.setUpdateTime(DateUtil.date());
            fileManager.setCreateTime(DateUtil.date());
        }
       return fileManager;
    }

    public FileMetadataInfoVo SFMToFiv(SysFileManager fileManager){
        FileMetadataInfoVo dto=  BeanUtil.copyProperties(fileManager, FileMetadataInfoVo.class);
        if(dto!=null){
            dto.setIsFinished(fileManager.getIsFinished() != 0);
            dto.setIsPart(fileManager.getIsPart() != 0);
            dto.setIsPreview(fileManager.getIsPreview() != 0);
            dto.setIsPrivate(fileManager.getIsPrivate() != 0);
        }
        return dto;
    }
}
